home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 January: Mac OS SDK / Dev.CD Jan 98 SDK2.toast / Development Kits (Disc 2) / QuickTime / Programming Stuff / Documentation / develop articles / develop Issue 23 / Internet Config / IC 1.1 / ICAppSourceKit1.1 / ICDocument.p < prev    next >
Encoding:
Text File  |  1997-02-26  |  12.5 KB  |  545 lines  |  [TEXT/PJMM]

  1. unit ICDocument;
  2.  
  3. interface
  4.  
  5.     uses
  6.         ICTypes;
  7.  
  8.     function DoNewDoc: OSErr;
  9.     function DoOpenDoc (fss: FSSpec): OSErr;
  10.     function DoCloseDocWindow (wp: WindowPtr): OSErr;
  11.     function DoCloseDoc: OSErr;
  12.     function DoQuit: OSErr;
  13.  
  14.     function DoSFOpen: OSErr;
  15.     function DoSave: OSErr;
  16.     function DoSaveAs: OSErr;
  17.     function DoOpenInternetPreferences: OSErr;
  18.  
  19.     function IsDocOpen: boolean;
  20.     function IsDocDirty: boolean;
  21.     function IsDocNew: boolean;
  22.  
  23.     function GetDocumentName: Str255;
  24.     function GetInstance: ICInstance;
  25.     procedure DirtyDocument;
  26.     function IsDocLocked: boolean;
  27.  
  28.     function DoOpenApp: OSErr;
  29.  
  30.     function InitICDocument: OSErr;
  31.     procedure TermICDocument;
  32.  
  33.     function EditPreference (var key: Str255; var fs: FSSpec; usefss, usecurrent: boolean): OSErr;
  34.  
  35. implementation
  36.  
  37.     uses
  38.         Folders, 
  39.  
  40.         ICStrH, 
  41.  
  42.         ICTypes, ICAPI, ICKeys, 
  43.  
  44.         ICGlobals, ICMiscSubs, ICSubs, ICDialogs, ICWindowGlobals, ICWindows, ICStandardFile;
  45.  
  46.     var
  47.         instance: ICInstance;
  48.         current_file: FSSpec;
  49.         current_seed: longInt;
  50.         scratch_file: FSSpec;            (* open if name <> '' *)
  51.         new_document: boolean;
  52.         dirty_document: boolean;
  53.         locked_document: boolean;
  54.  
  55.     function CopyFileSafe (source, dest: FSSpec): OSErr;
  56.         var
  57.             temp: FSSpec;
  58.             err, junk: OSErr;
  59.             count: integer;
  60.     begin
  61.         temp := dest;
  62.         count := 0;
  63.         repeat
  64.             temp.name := concat('Internet Config Temp ', DecStr(count));
  65.             err := HCreate(temp.vRefNum, temp.parID, temp.name, ICcreator, ICfiletype);
  66.             count := count + 1;
  67.         until err <> dupFNErr;
  68.         if err = noErr then begin
  69.             err := CopyFile(source, temp);
  70.             if err = noErr then begin
  71.                 junk := HDelete(dest.vRefNum, dest.parID, dest.name);
  72.                 err := HRename(dest.vRefNum, dest.parID, temp.name, dest.name);
  73.             end;
  74.         end;
  75.         CopyFileSafe := err;
  76.     end;
  77.  
  78.     function GetInstance: ICInstance;
  79.     begin
  80.         GetInstance := instance;
  81.     end; (* GetInstance *)
  82.  
  83.     function IsDocOpen: boolean;
  84.     begin
  85.         IsDocOpen := (scratch_file.name <> '');
  86.     end; (* IsDocOpen *)
  87.  
  88.     function IsDocDirty: boolean;
  89.     begin
  90.         IsDocDirty := IsDocOpen and dirty_document;
  91.     end; (* IsDocDirty *)
  92.  
  93.     function IsDocNew: boolean;
  94.     begin
  95.         IsDocNew := IsDocOpen and new_document;
  96.     end; (* IsDocNew *)
  97.  
  98.     procedure DirtyDocument;
  99.     begin
  100.         dirty_document := true;
  101.     end; (* DirtyDocument *)
  102.  
  103.     function IsDocLocked: boolean;
  104.     begin
  105.         IsDocLocked := IsDocOpen and locked_document;
  106.     end; (* IsDocLocked *)
  107.  
  108.     function GetDocumentName: Str255;
  109.     begin
  110.         if current_file.name = '' then begin
  111.             GetDocumentName := GetAString(128, 1);
  112.         end
  113.         else begin
  114.             GetDocumentName := current_file.name;
  115.         end; (* if *)
  116.     end; (* GetDocumentName *)
  117.  
  118.     procedure AddDefaultPrefs;
  119.  
  120.         function PrefExists (key: str255): boolean;
  121.             var
  122.                 attr: ICAttr;
  123.                 count: longInt;
  124.         begin
  125.             PrefExists := ICGetPref(instance, key, attr, nil, count) = noErr;
  126.         end;
  127.  
  128.         procedure SetPrefHandle (key: str255; h: handle);
  129.             var
  130.                 junk: ICError;
  131.         begin
  132.             if not PrefExists(key) then begin
  133.                 junk := ICSetPrefHandle(instance, key, ICattr_no_change, h);
  134.             end;
  135.         end;
  136.  
  137.         procedure SetPrefStr (key: str255; data: str255);
  138.             var
  139.                 junk: ICError;
  140.         begin
  141.             if not PrefExists(key) then begin
  142.                 junk := ICSetPrefStr(instance, key, ICattr_no_change, data);
  143.             end;
  144.         end;
  145.  
  146.         procedure SetPref (key: str255; data: ptr; size: longInt);
  147.             var
  148.                 junk: ICError;
  149.         begin
  150.             if not PrefExists(key) then begin
  151.                 junk := ICSetPref(instance, key, ICattr_no_change, data, size);
  152.             end;
  153.         end;
  154.  
  155.         procedure CopyServerPref (id: integer; key: Str255);
  156.             var
  157.                 tmph: Handle;
  158.         begin
  159.             tmph := GetResource('STR#', id);
  160.             if tmph <> nil then begin
  161.                 SetPrefHandle(concat(key, 'All'), tmph);
  162.                 SetPrefStr(concat(key, 'Preferred'), GetIndStrH(tmph, 1));
  163.             end; (* if *)
  164.         end; (* CopyServerPref *)
  165.  
  166.         procedure CopyPrefH (source_type: ResType; source_id: integer; dest_key: Str255);
  167.             var
  168.                 tmph: Handle;
  169.         begin
  170.             tmph := GetResource(source_type, source_id);
  171.             if tmph <> nil then begin
  172.                 SetPrefHandle(dest_key, tmph);
  173.             end; (* if *)
  174.         end; (* CopyPrefH *)
  175.  
  176.         procedure CopyHelpers;
  177.             var
  178.                 x: integer;
  179.                 key: Str255;
  180.                 appspec: ICAppSpec;
  181.                 i: integer;
  182.         begin
  183.             x := 1;
  184.             for i := 1 to CountStrs(666) div 3 do begin
  185.                 key := GetIndStr(666, x);
  186.                 x := x + 1;
  187.                 appspec.fCreator := copy(concat(GetIndStr(666, x), '    '), 1, 4);
  188.                 x := x + 1;
  189.                 appspec.name := GetIndStr(666, x);
  190.                 x := x + 1;
  191.                 SetPref(concat(kICHelper, key), @appspec, sizeof(appspec));
  192.             end; (* for *)
  193.         end; (* CopyHelpers *)
  194.  
  195.         var
  196.             err: OSErr;
  197.             junk: OSErr;
  198.     begin
  199.         CopyServerPref(200, 'Archie');
  200.         CopyServerPref(201, 'InfoMac');
  201.         CopyServerPref(202, 'UMich');
  202.         CopyPrefH('TaBl', 128, kICCharacterSet);
  203.         CopyPrefH('MAP ', 128, kICMapping);
  204.         CopyPrefH('STR ', 128, kICQuotingString);
  205.         CopyPrefH('SERV', 128, kICServices);
  206.         SetPrefStr(kICRealName, GetOwnerName);
  207.         CopyHelpers;
  208.     end;
  209.  
  210.     function CreateScratchFile (protofile: FSSpecPtr): OSErr;
  211.         var
  212.             err: OSErr;
  213.             count: integer;
  214.     begin
  215.         err := FindFolder(kOnSystemDisk, kTemporaryFolderType, kCreateFolder, scratch_file.vRefNum, scratch_file.parID);
  216.         if err = noErr then begin
  217. (*    scratch_file.parID := 2; *)
  218.             count := 0;
  219.             repeat
  220.                 scratch_file.name := concat('Internet Config Temp ', DecStr(count));
  221.                 err := HCreate(scratch_file.vRefNum, scratch_file.parID, scratch_file.name, ICcreator, ICfiletype);
  222.                 count := count + 1;
  223.             until err <> dupFNErr;
  224.         end; (* if *)
  225.         if err = noErr then begin
  226.             if protofile = nil then begin
  227.                 HCreateResFile(scratch_file.vRefNum, scratch_file.parID, scratch_file.name);
  228.                 (* temporary workaround bug in ICAPI *)
  229.             end
  230.             else begin
  231.                 err := CopyFile(protofile^, scratch_file);
  232.                 if err = noErr then begin
  233.                     err := HRstFLock(scratch_file.vRefNum, scratch_file.parID, scratch_file.name);
  234.                 end; (* if *)
  235.             end;
  236.         end;
  237.         if err = noErr then begin
  238.             err := ICMapErr(ICSpecifyConfigFile(instance, scratch_file));
  239.         end; (* if *)
  240.         if err = noErr then begin
  241.             err := ICMapErr(ICBegin(instance, icReadWritePerm));
  242.             if err = noErr then begin
  243.                 AddDefaultPrefs;
  244.                 err := ICMapErr(ICEnd(instance));
  245.             end; (* if *)
  246.         end; (* if *)
  247.         CreateScratchFile := err;
  248.     end; (* CreateScratchFile *)
  249.  
  250.     function DoCloseDoc: OSErr;
  251.         var
  252.             but: integer;
  253.             err: OSErr;
  254.             junk: OSErr;
  255.     begin
  256.         err := WindowsCloseAll;
  257.         if (err = noErr) & IsDocDirty then begin
  258.             ParamText(GetDocumentName, '', '', '');
  259.             InitCursor;
  260.             but := CautionAlert(135, @CancelDiscardModalFilter);
  261.             case but of
  262.                 ok:  begin
  263.                     err := DoSave;
  264.                 end;
  265.                 cancel: 
  266.                     err := userCanceledErr;
  267.                 otherwise
  268.             end; (* case *)
  269.         end; (* if *)
  270.         if err = noErr then begin
  271.             err := WindowsClose(windowinfo[WT_Main].window);
  272.         end; (* if *)
  273.         if err = noErr then begin
  274.             junk := HDelete(scratch_file.vRefNum, scratch_file.parID, scratch_file.name);
  275.             scratch_file.name := '';
  276.         end; (* if *)
  277.         DoCloseDoc := err;
  278.     end; (* DoCloseDoc *)
  279.  
  280.     function DoCloseDocWindow (wp: WindowPtr): OSErr;
  281.         var
  282.             wt: WindowType;
  283.             but: integer;
  284.             confirmed: boolean;
  285.             err: OSErr;
  286.     begin
  287.         err := noErr;
  288.         wt := GetWindowType(wp);
  289.         case wt of
  290.             WT_None: 
  291.                 ;
  292.             WT_About: 
  293.                 HideWindow(wp);
  294.             WT_Main: 
  295.                 err := DoCloseDoc;
  296.             otherwise
  297.                 err := WindowsClose(wp);
  298.         end; (* case *)
  299.         DoCloseDocWindow := err;
  300.     end; (* DoCloseDocWindow *)
  301.  
  302.     function DoNewDoc: OSErr;
  303.         var
  304.             err: OSErr;
  305.             junk: OSErr;
  306.     begin
  307.         err := DoCloseDoc;
  308.         if err = noErr then begin
  309.             WindowsResetPositions;
  310.             new_document := true;
  311.             dirty_document := false;
  312.             locked_document := false;
  313.             err := CreateScratchFile(nil);
  314.             if err = noErr then begin
  315.                 err := WindowsOpen(WT_Main);
  316.             end;
  317.             if err = noErr then begin
  318.                 WindowsSetTitle(WT_Main, GetAString(128, 1));
  319.                 current_file.name := '';                        (* make it untitled *)
  320.             end; (* if *)
  321.         end; (* if *)
  322.         DoNewDoc := err;
  323.     end; (* DoNewDoc *)
  324.  
  325.     procedure CurrentSeed (var seed: longInt);
  326.         var
  327.             err: OSErr;
  328.     begin
  329.         seed := 0;
  330.         if current_file.name <> '' then begin
  331.             err := ICSpecifyConfigFile(instance, current_file);
  332.             if err = noErr then begin
  333.                 err := ICGetSeed(instance, seed);
  334.             end;
  335.             err := ICSpecifyConfigFile(instance, scratch_file);
  336.         end;
  337.     end;
  338.  
  339.     function SameSeed (seed1, seed2: longInt): boolean;
  340.     begin
  341.         SameSeed := (seed1 = seed2) or (seed1 = 0) or (seed2 = 0);
  342.     end;
  343.  
  344.     function DoOpenDoc (fss: FSSpec): OSErr;
  345.         var
  346.             count: integer;
  347.             err: OSErr;
  348.             junk: OSErr;
  349.     begin
  350.         err := DoCloseDoc;
  351.         if err = noErr then begin
  352.             new_document := false;
  353.             dirty_document := false;
  354.             locked_document := FileLocked(fss);
  355.             err := CreateScratchFile(@fss);
  356.             if err = noErr then begin
  357.                 WindowsRestorePositions;
  358.                 err := WindowsOpen(WT_Main);
  359.             end;
  360.             if err = noErr then begin
  361.                 WindowsSetTitle(WT_Main, fss.name);
  362.                 current_file := fss;
  363.             end; (* if *)
  364.             CurrentSeed(current_seed);
  365.         end; (* if *)
  366.         DoOpenDoc := err;
  367.     end; (* DoOpenDoc *)
  368.  
  369.     function DoQuit: OSErr;
  370.         var
  371.             err: OSErr;
  372.     begin
  373.         err := DoCloseDoc;
  374.         if err = noErr then begin
  375.             quitNow := true;
  376.         end; (* if *)
  377.         DoQuit := err;
  378.     end; (* DoQuit *)
  379.  
  380.     function DoSFOpen: OSErr;
  381.         var
  382.             err: OSErr;
  383.             fss: FSSpec;
  384.             info: FInfo;
  385.     begin
  386.         err := ICStandardGetFile(ICfiletype, fss, info);
  387.         if err = noErr then begin
  388.             err := DoOpenDoc(fss);
  389.         end; (* if *)
  390.         DoSFOpen := err;
  391.     end; (* DoSFOpen *)
  392.  
  393.     function FindInternetPreferences (var default_config: FSSpec): OSErr;
  394.         var
  395.             err: OSErr;
  396.             isfolder, wasalias: boolean;
  397.     begin
  398.         err := FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder, default_config.vRefNum, default_config.parID);
  399.         if err = noErr then begin
  400.             err := ICMapErr(ICDefaultFileName(instance, default_config.name));
  401.         end; (* if *)
  402.         if err = noErr then begin
  403.             if has_aliasMgr then begin
  404.                 err := ResolveAliasFile(default_config, true, isfolder, wasalias);
  405.             end;
  406.         end;
  407.         FindInternetPreferences := err;
  408.     end;
  409.  
  410.     function EditPreference (var key: Str255; var fs: FSSpec; usefss, usecurrent: boolean): OSErr;
  411.         var
  412.             err: OSErr;
  413.     begin
  414.         err := noErr;
  415.         if not usefss then begin
  416.             if usecurrent then begin
  417.                 fs := current_file;
  418.                 usecurrent := IsDocOpen;
  419.             end;
  420.             if not usecurrent then begin
  421.                 err := FindInternetPreferences(fs);
  422.             end;
  423.         end;
  424.         if err = noErr then begin
  425.             if not IsDocOpen | (fs.vrefnum <> current_file.vrefnum) | (fs.parID <> current_file.parID) | (IUEqualString(fs.name, current_file.name) <> 0) then begin
  426.                 err := DoOpenDoc(fs);
  427.             end;
  428.         end;
  429.         if err = noErr then begin
  430.             if key <> '' then begin
  431.                 err := EditCurrentPreference(key);
  432.             end;
  433.         end;
  434.         EditPreference := err;
  435.     end;
  436.  
  437.     function DoOpenInternetPreferences: OSErr;
  438.         var
  439.             default_config: FSSpec;
  440.             err: OSErr;
  441.     begin
  442.         err := FindInternetPreferences(default_config);
  443.         if err = noErr then begin
  444.             err := DoOpenDoc(default_config);
  445.         end; (* if *)
  446.         DoOpenInternetPreferences := err;
  447.     end;
  448.  
  449.     function InternalDoSave (fss: FSSpec): OSErr;
  450.         var
  451.             err: OSErr;
  452.     begin
  453.         err := noErr;
  454.         err := WindowsFlushAll;
  455.         if err = noErr then begin
  456.             WindowsSavePositions;
  457.             err := CopyFileSafe(scratch_file, fss);
  458.         end; (* if *)
  459.         if err = noErr then begin
  460.             WindowsSetTitle(WT_Main, fss.name);
  461.             new_document := false;
  462.             dirty_document := false;
  463.             current_file := fss;
  464.         end; (* if *)
  465.         CurrentSeed(current_seed);
  466.         InternalDoSave := err;
  467.     end; (* InternalDoSave *)
  468.  
  469.     function DoSave: OSErr;
  470.         var
  471.             err: OSErr;
  472.             seed: longInt;
  473.             a: integer;
  474.     begin
  475.         if current_file.name = '' then begin
  476.             err := DoSaveAs;
  477.         end
  478.         else begin
  479.             CurrentSeed(seed);
  480.             a := ok;
  481.             if not SameSeed(seed, current_seed) then begin
  482.                 a := CautionAlert(160, @CancelModalFilter);
  483.             end;
  484.             if a = ok then begin
  485.                 err := InternalDoSave(current_file);
  486.             end;
  487.         end; (* if *)
  488.         DoSave := err;
  489.     end; (* DoSave *)
  490.  
  491.     function DoSaveAs: OSErr;
  492.         var
  493.             err: OSErr;
  494.             fss: FSSpec;
  495.     begin
  496.         err := ICStandardPutFile('', GetDocumentName, fss);
  497.         if err = noErr then begin
  498.             err := InternalDoSave(fss);
  499.         end; (* if *)
  500.         DoSaveAs := err;
  501.     end; (* DoSaveAs *)
  502.  
  503.     function DoOpenApp: OSErr;
  504.         var
  505.             default_config: FSSpec;
  506.             err: OSErr;
  507.     begin
  508.         err := FindInternetPreferences(default_config);
  509.         if err = noErr then begin
  510.             err := DoOpenDoc(default_config);
  511.         end; (* if *)
  512.         if err = fnfErr then begin
  513.             err := DoNewDoc;
  514.             if err = noErr then begin
  515.                 err := InternalDoSave(default_config);
  516.             end; (* if *)
  517.         end; (* if *)
  518.         DoOpenApp := err;
  519.     end; (* DoOpenApp *)
  520.  
  521.     function InitICDocument: OSErr;
  522.         var
  523.             inst: ICInstance;
  524.             err: OSErr;
  525.     begin
  526.         instance := nil;
  527.         current_file.name := '';
  528.         scratch_file.name := '';
  529.         err := ICMapErr(ICStart(inst, ICcreator));
  530.         if err = noErr then begin
  531.             instance := inst;
  532.         end; (* if *)
  533.         InitICDocument := err;
  534.     end; (* InitICDocument *)
  535.  
  536.     procedure TermICDocument;
  537.         var
  538.             junk: ICError;
  539.     begin
  540.         if instance <> nil then begin
  541.             junk := ICStop(instance);
  542.         end; (* if *)
  543.     end; (* TermICDocument *)
  544.  
  545. end. (* ICDocument *)